#define _CRT_SECURE_NO_WARNINGS

//int Compare(const void* p1, const void* p2)
//{
//    return *(int*)p1 - *(int*)p2;
//}
//int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
//    qsort(nums1, nums1Size, sizeof(int), Compare);
//    qsort(nums2, nums2Size, sizeof(int), Compare);
//    int max = nums1Size > nums2Size ? nums1Size : nums2Size;
//    int* ret = (int*)malloc(sizeof(int) * max);
//    *returnSize = 0;
//    int index1 = 0, index2 = 0;
//    while (index1 < nums1Size && index2 < nums2Size)
//    {
//        if (nums1[index1] == nums2[index2])
//        {
//            if (*returnSize == 0 || ret[(*returnSize) - 1] != nums1[index1])
//            {
//                ret[(*returnSize)++] = nums1[index1];
//            }
//            index1++;
//            index2++;
//        }
//        else if (nums1[index1] < nums2[index2])
//        {
//            index1++;
//        }
//        else
//        {
//            index2++;
//        }
//    }
//    return ret;
//}
//
//
//void Swap(int* p1, int* p2)
//{
//    int tmp = *p1;
//    *p1 = *p2;
//    *p2 = tmp;
//}
//int thirdMax(int* nums, int numsSize) {
//
//    if (numsSize < 3)
//    {
//        if (numsSize == 2)
//            return nums[1] > nums[0] ? nums[1] : nums[0];
//        return nums[0];
//    }
//    int mini = 0;
//    int maxi = 0;
//    for (int i = 1; i < numsSize; i++)
//    {
//        if (nums[i] > nums[maxi])
//            maxi = i;
//        if (nums[i] < nums[mini])
//            mini = i;
//    }
//    Swap(&nums[0], &nums[mini]);
//    if (maxi == 0)
//        maxi = mini;
//    Swap(&nums[numsSize - 1], &nums[maxi]);
//    int min = nums[1];
//    for (int i = 2; i < numsSize - 1; i++)
//    {
//        if (nums[i] < min)
//            min = nums[i];
//    }
//    return min;
//}
//
//
//
//void Swap(int* p1, int* p2)
//{
//    int tmp = *p1;
//    *p1 = *p2;
//    *p2 = tmp;
//}
//int Compare(const void* p1, const void* p2)
//{
//    return *(int*)p1 - *(int*)p2;
//}
//int thirdMax(int* nums, int numsSize) {
//
//    if (numsSize < 3)
//    {
//        if (numsSize == 2)
//            return nums[1] > nums[0] ? nums[1] : nums[0];
//        return nums[0];
//    }
//    qsort(nums, numsSize, sizeof(int), Compare);
//    int count = 2;
//    int end = numsSize - 1;
//    while (end > 0 && count)
//    {
//        while (end - 1 >= 0 && nums[end - 1] == nums[end])
//        {
//            end--;
//        }
//        if (end - 1 < 0)
//            break;
//        count--;
//        end--;
//    }
//    if (count > 0)
//        return nums[numsSize - 1];
//    else
//        return nums[end];
//}
//
//
//void Swap(int* p1, int* p2)
//{
//    int tmp = *p1;
//    *p1 = *p2;
//    *p2 = tmp;
//}
//int Compare(const void* p1, const void* p2)
//{
//    return *(int*)p1 < *(int*)p2;
//}
//int thirdMax(int* nums, int numsSize) {
//
//    qsort(nums, numsSize, sizeof(int), Compare);
//    int diff = 0;
//    for (int i = 1; i < numsSize; i++)
//    {
//        if (nums[i] != nums[i - 1] && ++diff == 2)
//        {
//            return nums[i];
//        }
//    }
//    return nums[0];
//
//}


int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    const int a = numsSize;
    int tmp[a + 1];
    memset(tmp, 0, numsSize + 1);
    for (int i = 0; i < numsSize; i++)
    {
        tmp[nums[i]]++;
    }
    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = 0;
    for (int i = 1; i <= numsSize; i++)
    {
        if (tmp[i] == 0)
        {
            ret[(*returnSize)++] = i;
        }
    }
    return ret;
}

int main()
{
    int arr[] = { 4,3,2,7,8,2,3,1 };
    int returnSize = 0;
    int* ret = findDisappearedNumbers(arr, sizeof(arr) / sizeof(int), &returnSize);
    for (int i = 0; i < returnSize; i++)
    {
        printf("%d ", ret[i]);
    }
}